home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 014 / ippon014.lzh / main.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  8KB  |  328 lines

  1. /* 男は一本槍 */
  2.  
  3. /* main.c */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/dos.h>
  9. #include <sys/iocs.h>
  10. #include <XSP2lib.H>
  11.  
  12.  
  13. #define GLOBAL_DEFINE        /* グローバル変数を確保する */
  14. #include "main.h"
  15. #include "player.h"
  16. #include "shot.h"
  17. #include "enemy.h"
  18. #include "eshot.h"
  19. #include "effect.h"
  20. #include "psearch.h"
  21.  
  22. static int old_crtmod;
  23.  
  24. #define PCG_MAX    256        /* パターンデータの個数 */
  25. #define FRM_MAX    4096    /* フレームデータの個数 */
  26. #define REF_MAX    512        /* リファレンスデータの個数 */
  27.  
  28. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  29. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  30. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  31. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  32.  
  33. static int sizeof_pcg = 0;    /* スプライトPCGパターン読み込み数 */
  34. static int sizeof_ref = 0;    /* 複合スプライトリファレンスデータ読み込み数 */
  35. static int sizeof_frm = 0;    /* 複合スプライトフレームデータ読み込み数 */
  36.  
  37. static unsigned short pal_dat[16][15];    /* パレットデータ */
  38.  
  39.  
  40.  
  41. void usage (void)
  42. {
  43.     printf (
  44.                "縦スクロールシューティング・一本槍 IPPON.X ver0.14"
  45.                "        programmed by Mitsuky <FreeSoftware>\n"
  46.                "敵キャラのルーチンを FuncEnemy/ 以下に分離\n"
  47.                "エフェクトのルーチンを FuncEffect/ 以下に分離\n"
  48.                "敵キャラのコアを表示するようにした\n"
  49.         );
  50. }
  51.  
  52.  
  53.  
  54. /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
  55. void Tini (void)
  56. {
  57.     int sp;
  58.  
  59.     switch (error_level) {
  60.     case ERROR_NON:
  61.         xsp_off ();
  62.         /* 画面モードを元に戻す */
  63.         sp = _iocs_b_super (0);
  64.         *(unsigned short *) 0xe8e006 &= 0xfffd;        /* HRL ビットを元に戻す */
  65.         _iocs_b_super (sp);
  66.         _iocs_crtmod (old_crtmod);
  67.         _dos_kflushio (0xff);    /* キーバッファをクリア */
  68.         /* break が無い事に注意 */
  69.  
  70.     case ERROR_FILE:
  71.         _iocs_tgusemd (1, 3);
  72.         /* break が無い事に注意 */
  73.     case ERROR_GUSEMD:
  74.         _iocs_tgusemd (0, 3);
  75.         /* break が無い事に注意 */
  76.     case ERROR_TUSEMD:
  77.         /* break が無い事に注意 */
  78.     default:
  79.         break;
  80.     }
  81.  
  82.     if (error_level != ERROR_NON) {
  83.         /* エラーが発生した場合 */
  84.         puts (error_message);
  85.         exit (-1);    /* 終了する */
  86.     }
  87. }
  88.  
  89.  
  90.  
  91. /* 起動時のファイル読み込み */
  92. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  93. /* 返り値 : 読み込んだ項目数 */
  94. static int LoadFile (char *fname, void *ptr, size_t size, size_t n)
  95. {
  96.     FILE *fp;
  97.     int i;
  98.  
  99.     fp = fopen (fname, "rb");
  100.     if (fp == NULL) {
  101.         static char e[256];
  102.         error_level = ERROR_FILE;
  103.         error_message = e;
  104.         sprintf (e, "ファイル %s が読み込めません\n", fname);
  105.         Tini ();    /* 返ってこない */
  106.     }
  107.     i = fread (ptr, size, n, fp);
  108.     fclose (fp);
  109.  
  110.     return (i);        /* 返り値は読み込み項目数 */
  111. }
  112.  
  113.  
  114.  
  115. /* XSP 各種データ読み込み・ファイル名は拡張子を付けずに指定すること */
  116. /* 返り値 : 複合スプライトNo. */
  117. static short LoadXSP (char *fname)
  118. {
  119.     int i;
  120.     int p, f, r;
  121.     short obj_no = sizeof_ref;
  122.     char temp_fname[92];
  123.  
  124.     strcpy (temp_fname, fname);
  125.     strcat (temp_fname, ".FRM");
  126.     f = LoadFile (temp_fname, &frm_dat[sizeof_frm], sizeof (XOBJ_FRM_DAT), FRM_MAX - sizeof_frm);
  127.  
  128.     strcpy (temp_fname, fname);
  129.     strcat (temp_fname, ".REF");
  130.     r = LoadFile (temp_fname, &ref_dat[sizeof_ref], sizeof (XOBJ_REF_DAT), REF_MAX - sizeof_ref);
  131.  
  132.     strcpy (temp_fname, fname);
  133.     strcat (temp_fname, ".XSP");
  134.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  135.  
  136.     /* FRM_DAT[].pt 補正 */
  137.     for (i = 0; i < f; i++)
  138.         frm_dat[sizeof_frm + i].pt += sizeof_pcg / 128;
  139.  
  140.     /* REF_DAT[].ptr 補正 */
  141.     for (i = 0; i < r; i++)
  142.         (int) ref_dat[sizeof_ref + i].ptr += (int) (&frm_dat[sizeof_frm]);
  143.     sizeof_pcg += p;
  144.     sizeof_frm += f;
  145.     sizeof_ref += r;
  146.  
  147. #ifdef DEBUG
  148.     printf ("%s を読み込みました sizeof_ref = %hd\n", fname, obj_no);
  149. #endif
  150.  
  151.     return (obj_no);
  152. }
  153.  
  154.  
  155.  
  156. /* SP データ読み込み */
  157. static short LoadSP (char *fname)
  158. {
  159.     int p;
  160.     short sp_no = sizeof_pcg / 128;
  161.     char temp_fname[92];
  162.  
  163.     strcpy (temp_fname, fname);
  164.     strcat (temp_fname, ".SP");
  165.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  166.  
  167.     sizeof_pcg += p;
  168.  
  169. #ifdef DEBUG
  170.     printf ("%s を読み込みました sp_no = %hd\n", fname, sp_no);
  171. #endif
  172.     return (sp_no);
  173. }
  174.  
  175.  
  176.  
  177. /* 起動時に1度だけ呼ばれる */
  178. static void Init (void)
  179. {
  180.     int sp;
  181.     int i, j;
  182.     static unsigned short crtcdata[9] =
  183.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
  184.     unsigned short *d;
  185.  
  186.     error_message = NULL;
  187.  
  188.     /* テキスト画面の使用状況をチェック */
  189.     error_level = ERROR_TUSEMD;
  190.     if (_iocs_tgusemd (1, -1) == 2) {    /* ユーザーが使用中なら */
  191.         error_message = "テキスト VRAM が使用中です";
  192.         Tini ();
  193.     }
  194.     _iocs_tgusemd (1, 2);
  195.     /* グラフィック画面の使用状況をチェック */
  196.     error_level = ERROR_GUSEMD;
  197.     i = _iocs_tgusemd (0, -1);
  198.     if ((i == 1) || (i == 2)) {    /* システムまたはユーザーが使用中なら */
  199.         error_message = "グラフィック VRAM が使用中です";
  200.         Tini ();
  201.     }
  202.     _iocs_tgusemd (0, 2);
  203.  
  204.  
  205.     /* 各種ファイル読み込み */
  206.     error_level = ERROR_FILE;
  207.     obj_player = LoadXSP ("SP/PLAYER");
  208.     obj_shot = LoadXSP ("SP/SHOT");
  209.     obj_zako02 = LoadXSP ("SP/ZAKO02");
  210.     obj_explall = LoadXSP ("SP/EXPLALL");
  211.  
  212.     sp_core = LoadSP ("SP/CORE");
  213.     sp_eshot = LoadSP ("SP/ESHOT");
  214.  
  215. #ifdef DEBUG
  216.     printf ("    PCG 使用数 = %d\n    REF 使用数 = %d\n    FRM 使用数 = %d\n",
  217.         sizeof_pcg / 128, sizeof_ref, sizeof_frm);
  218. #endif
  219.  
  220.     LoadFile ("SP/PLAYER.PAL", &pal_dat, sizeof (unsigned short), 16 * 15);
  221.  
  222.     LoadFile ("TBL/PSTABLE.TBL", pstable, sizeof (unsigned char), 256 * 256);
  223.     LoadFile ("TBL/XYTABLE.DAT", &xytable, sizeof (VECTOR), SPEED_MAX * 256);
  224.  
  225.     error_level = ERROR_NON;    /* エラーなし */
  226.  
  227.     /* XSP 関連の初期化 */
  228.     xsp_on ();
  229.     xsp_mode (3);
  230.     /* パターンデータを定義 */
  231.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  232.     xsp_objdat_set (ref_dat);
  233.  
  234.  
  235.     /* 画面モードの初期化 */
  236.     /* 256x256ドット 31kHz 256色モードに */
  237.     old_crtmod = _iocs_crtmod (-1);        /* 前の CRTMOD を保存 */
  238.     _iocs_crtmod (10);    /* 256x256dot 31kHz 256色 */
  239.     _iocs_g_clr_on ();    /* 一応 */
  240.     _iocs_sp_init ();    /* スプライトの初期化 */
  241.     _iocs_sp_on ();
  242.  
  243.     /* 256x256 正方形モードを作る */
  244.     sp = _iocs_b_super (0);
  245.     *(unsigned short *) 0xe80028 = crtcdata[8];
  246.     d = (unsigned short *) 0xe80002;
  247.     for (i = 1; i < 8; i++)
  248.         *d++ = crtcdata[i];
  249.     *(unsigned short *) 0xe80000 = crtcdata[0];
  250.  
  251.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  252.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  253.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  254.     *(unsigned short *) 0xeb080e = crtcdata[6];
  255.     *(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
  256.         = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
  257.         = (0 << 16) + 0;    /* グラフィック画面の座標 */
  258.  
  259.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  260.     _iocs_b_super (sp);
  261.  
  262.     /* パレットデータを定義 */
  263.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  264.     {
  265.         unsigned short *p = (unsigned short *) pal_dat;
  266.         for (i = 1; i < 15; i++)
  267.             for (j = 0; j < 16; j++)
  268.                 _iocs_spalet (0x80000000 | j, i, *p++);
  269.     }
  270.  
  271. }
  272.  
  273.  
  274.  
  275. /* ゲーム本体 */
  276. static void Game (void)
  277. {
  278.     int enemy_counter = 0;    /* 敵キャラ出現カウンター */
  279.  
  280.     printf ("ジョイスティックの [A] ボタンを押すと終了します\n");
  281.  
  282.     PlayerInit ();
  283.     ShotInit ();
  284.     EnemyInit ();
  285.     EshotInit ();
  286.     EffectInit ();
  287.  
  288.     PlayerAlloc ();
  289.  
  290.     do {
  291.         xsp_vsync (0);    /* 垂直同期を待つ */
  292.  
  293.         /* 敵キャラ出現(てきとー) */
  294.         enemy_counter++;
  295.         if (enemy_counter == 40) {
  296.             /* 種類0の敵を自機の反対のX座標に出現 */
  297.             EnemyAlloc (0, 144 + (144 - player->x), -32);
  298.         }
  299.         if (enemy_counter == 80) {
  300.             enemy_counter = 0;
  301.             /* 種類1の敵を自機と同じX座標に出現 */
  302.             EnemyAlloc (1, player->x, -32);
  303.         }
  304.  
  305.         PlayerMove ();
  306.         ShotMove ();
  307.         EnemyMove ();
  308.         EshotMove ();
  309.         EffectMove ();
  310.         xsp_out ();    /* 表示 */
  311.     } while (!game_over);
  312. }
  313.  
  314.  
  315.  
  316. int main (int argc, char *argv[])
  317. {
  318.     if (argc != 1) {
  319.         usage ();
  320.         return (-1);
  321.     }
  322.     Init ();
  323.     Game ();
  324.     Tini ();
  325.  
  326.     return (0);
  327. }
  328.